

////////Temperature and humidity  //温湿度传感器//////////


//#include "dev_temper.h"


#ifndef __DEV_TEMPER_H__
#define __DEV_TEMPER_H__

#include "dev_module.h"
#include "iot_message.pb.h"
#include <stdint.h>
#include "iot_node.h"



#define  temp_humi_max_dev_addr        (245U)      // 液位设备地址	R/W	否	配置参数	uint8_t	0~255
#define  temp_humi_max_channel          (31U)      // 液位设备通道编号	R/W	否	配置参数	uint8_t	0~31



/*-----------------------------------------------------------------------------------------------


read_attr_num=18, uploadNum=14, totalFrame=1
{"head":{"gatewayId":"gw_1C3283005078","replaceId":"gw_1736220236415","msgId":0,"timeStamp":1736221305,"response":"readAttr"},
"data":{"nodeType":1,"channel":1,"privAddr":1,"mac":"FFFFFFFFFFFF","name":"tempe_1_3","pid":"4003","totalFrame":1,"currFrame":1,"totalAttr":14,"itemCnt":14},
"attrLst":[{"name":"tempe","lable":"温度读数","class":17,"dpid":16,"val":1988},{"name":"hum","lable":"湿度读数","class":17,"dpid":17,"val":4501},
{"name":"rptT","lable":"温度上报值","class":17,"dpid":48,"val":20},{"name":"h","lable":"湿度计算值","class":17,"dpid":32771,"val":4501},
{"name":"rptH","lable":"湿度上报值","class":17,"dpid":1281,"val":45},{"name":"almTL","lable":"低温报警","class":17,"dpid":65280,"val":0},
{"name":"almTH","lable":"高温报警","class":17,"dpid":65281,"val":1},{"name":"almHumL","lable":"湿度低报警","class":17,"dpid":65282,"val":0},
{"name":"almHumH","lable":"湿度高报警","class":17,"dpid":65283,"val":1},{"name":"humFallAlm","lable":"湿度异常下降报警","class":17,"dpid":65294,"val":0},
{"name":"humRiseAlm","lable":"湿度异常上升报警","class":17,"dpid":65295,"val":0},{"name":"humDeltaAlm","lable":"湿度异常变化报警","class":17,"dpid":65296,"val":0},
{"name":"tempeRise","lable":"温度变化值","class":17,"dpid":65297,"val":20},{"name":"tempeFallAlm","lable":"温降异常报警","class":17,"dpid":65302,"val":0}]}


									
0x0801	软件版本	RO	否	软件版本	string	最大32字节			
0x0802	硬件版本	RO	否	硬件版本	string	最大32字节			
0x0803	产品型号	RO	否	产品型号	string	最大32字节			
0x0804	生产信息	RO	否	生产信息	string	最大32字节			生产日期，生产批次等信息
0x0805	厂家信息	RO	否		string	最大32字节			生产商名称信息

-----------------------------------------------------------------------------------------*/

/////-----设备类型----
//#define   DEV_TEMP_HUMI_TYPE     (0xD006)     //液位传感器（D006H） 



////以下枚举的取值 需要结合 数组 temp_humi_iot_id_table[temp_humi_index_end]的下标进行关联的定义---同步更新----
typedef enum{

    temp_humi_index_run_data_begin      = 0,    // 设备运行参数
    temp_humi_index_run_data_end        = 3,   
    temp_humi_index_config_data_begin   = 3,    // 设备配置参数-------------超过 8个时需要分帧处理
    temp_humi_index_factory_info_begin  = 10,   // 设备出厂信息
    temp_humi_index_end = 15,

} temp_humi_attr_index_e;







#pragma pack(1)

//0x0500	液位报警信息 "0=正常，1=告警
typedef union{
    struct{

        uint32_t under_temper : 1;      // 温度过低
        uint32_t over_temper  : 1;	    // 温度过高

        uint32_t under_humidity:1;   //湿度度过低
        uint32_t over_humidity:1;    //湿度度过高
        uint32_t change_temper:1;    //温度变化异常
        uint32_t change_humidity:1;  //湿度变化异常

        uint32_t res1:26;
    }bit;
    uint32_t value;
} temp_humi_alarm_u;


//液位传感器（D006H）的数据
///---------RO 数据--------//
typedef struct{

    uint16_t   humidity;   //0x0511	湿度	RO	否	运行参数	uint16_t		0.01%	
								
    int16_t    temper;   // 0x0502	温度	RO	否	运行参数	int16_t	-32768~32767	0.01℃							

    temp_humi_alarm_u  alarm;   //0x0500	液位报警信息"0=正常，1=告警
                                 //bit0：液位过低bit1：液位过高bit2：温度过低bit3：温度过高

} temp_humi_data_t;




								
// 0x0602	设备通道编号	R/W	否	配置参数	uint8_t	0~31		
								
// 0x0606	温度过低阈值	R/W	否	配置参数	int16_t	-32768~32767	0.01℃	
// 0x0607	温度过高阈值	R/W	否	配置参数	int16_t	-32768~32767	0.01℃	
// 0x0610	温湿度报警使能	R/W	否	配置参数	uint32_t			0
// 0x0611	湿度过低阈值	R/W	否	配置参数	uint16_t			
// 0x0612	湿度过高阈值	R/W	否	配置参数	uint16_t			
// 0x0613	温度变化监测周期	R/W	否	配置参数	uint32_t		sec	
// 0x0614	温度变化异常值	R/W	否	配置参数	int16_t	-32768~32767	0.01℃	
// 0x0615	湿度变化监测周期	R/W	否	配置参数	uint32_t		sec	
// 0x0616	湿度变化异常值	R/W	否	配置参数	int16_t			



///---------R/W	配置参数--------//
typedef struct{

    uint8_t   addr;                  //设备地址  0~255			
    uint8_t   channel;               //0x0602	设备通道编号	0~31	
    int16_t   under_temper_th;       //温度过低阈值  1℃ 
    int16_t   over_temper_th;        //温度过高阈值  1℃   
    uint32_t  under_humidity_th;     //温湿过低阈值  0.01mm
    uint32_t  over_humidity_th;      //温湿过高阈值  0.01mm

    ///<<温湿度传感器物模型-v1.1>>
    // uint32_t  temper_monitor_sec_th;    // 0x0613	温度变化监测周期	R/W	否	配置参数	uint32_t		sec	
    // uint32_t  temper_monitor_th;        // 0x0614	温度变化异常值	R/W	否	配置参数	int16_t	-32768~32767	0.01℃	
    // uint32_t  humidity_monitor_sec_th;  // 0x0615	湿度变化监测周期	R/W	否	配置参数	uint32_t		sec	
    // uint32_t  humidity_monitor_th;      // 0x0616	湿度变化异常值	R/W	否	配置参数	int16_t			

    temp_humi_alarm_u   alarm_enable;   // 温湿度报警使能 "0=不启用，1=启用

} temp_humi_config_t;




//---配置节点信息----------


typedef union
{
	struct{	
		
	  uint16_t online                  :1;	  //节点在线标志-----1:在线，0:离线，

	  uint16_t res                     :15;  
		
	}bit;
	
  uint16_t all;

} temp_humi_node_flags_u;





// typedef enum{

//     index_1,    //
//     index_max,

// } temp_humi_index_e;


//#define   TEMP_HUMI_NODE_NUM_MAX    (255U)  

#define   TEMP_HUMI_NODE_NUM_MAX    (NODE_NUM_MAX)     ///与配置节点总数相关-----



typedef struct{
    temp_humi_data_t         data;
    temp_humi_config_t       config;
    dev_attr_com_info_t      info;

    temp_humi_node_flags_u  flags;
  //  char   dev_name_str[32];   
} temp_humi_attr_t;


#pragma pack()


extern const  uint16_t  temp_humi_iot_id_table[temp_humi_index_end];



/**
 * @brief 
 * 
 */
void temp_humi_param_init(void);

uint8_t temp_humi_add_obj(uint8_t idx,uint8_t channel,uint8_t addr);


/**
 * @brief 
 * 
 * @param in idx 
 * @return temp_humi_attr_t ==NULL 查询出错,   !NULL 查询ok
 */
temp_humi_attr_t*  temp_humi_get_obj(uint8_t idx) ;  //temp_humi_attr_get


/**
 * @brief temp_humi_set_obj() 赋值节点数据
 * 
 * @param in idx
 * @param in p_attr
 * @return 0=失败，1=成功 
 */
uint8_t  temp_humi_set_obj(uint8_t idx,temp_humi_attr_t* p_attr )  ;



  //  temp_humi_index_run_data_begin      = 0,    // 设备运行参数
  //  temp_humi_index_config_data_begin   = 3,    // 设备配置参数
/**
 * @brief 根据下标，获取iot_id 的编号
 * 
 * @param idx 
 */
uint16_t  temp_humi_get_iot_id(uint8_t idx);


/**
 * @brief 
 * 
 * @param attr_id 
 * @param attr_out 
 */
void temp_humi_get_attr(uint8_t idx,uint16_t attr_id, IotModel* attr_out);


/**
 * @brief 
 * 
 * @param attr_in 
 * @return uint8_t 
 */
uint8_t temp_humi_set_attr(uint8_t idx,IotModel* attr_in);


void temp_humi_test_tick_min(uint8_t idx);

////刷新节点运行数据
void temp_humi_update_tick_min(uint8_t idx,int8_t temper ,uint32_t temp_humi );

void temp_humi_obj_update(uint8_t idx,temp_humi_attr_t* pliq_in  );




#endif //------__DEV_TEMPER_H__




















